#include "config.h"
#include <stdio.h>
#include <string.h>

// 全局根路径定义（由 config_load 初始化）
char g_root_path[ROOT_PATH_LEN] = {0};

/**
 * 从配置文件加载配置项（IP 和端口）。
 *
 * 实现说明：
 * - 函数会先填充默认值（ip=127.0.0.1，port=8080）。
 * - 如果配置文件不存在，函数返回 0 并保持默认值。
 * - 配置文件采用简单的 key=value 格式，支持注释（# 开头）和空行。
 * - 目前仅解析两个 key：ip 和 port，键名区分大小写。
 */
int config_load(const char *path, server_config_t *cfg)
{
    if (path == NULL || cfg == NULL)
    {
        return -1; // 参数不合法
    }

    /* 预设默认值，保证在无法读取配置时程序仍然可用 */
    strncpy(cfg->ip, "127.0.0.1", sizeof(cfg->ip) - 1);
    cfg->ip[sizeof(cfg->ip) - 1] = '\0';
    strncpy(cfg->port, "8080", sizeof(cfg->port) - 1);
    cfg->port[sizeof(cfg->port) - 1] = '\0';
    /* 默认网盘根路径 */
    strncpy(cfg->root_path, "./data", sizeof(cfg->root_path) - 1);
    cfg->root_path[sizeof(cfg->root_path) - 1] = '\0';
    strncpy(g_root_path, cfg->root_path, sizeof(g_root_path) - 1);
    g_root_path[sizeof(g_root_path) - 1] = '\0';

    FILE *f = fopen(path, "r");
    if (!f)
    {
        /* 配置文件打开失败（例如不存在或权限不足），使用默认值返回成功 */
        return 0;
    }

    char line[256];
    while (fgets(line, sizeof(line), f))
    {
        /* 去掉行首的空白字符（空格、制表符） */
        char *p = line;
        while (*p == ' ' || *p == '\t')
            p++;

        /* 跳过注释行和空行 */
        if (*p == '#' || *p == '\n' || *p == '\0')
            continue;

        /* 简单解析 key=value 格式，注意这里只处理不包含等号的值 */
        char key[128];
        char value[128];
        if (sscanf(p, "%127[^=]=%127s", key, value) == 2)
        {
            if (strcmp(key, "ip") == 0)
            {
                /* 将 IP 写入配置结构，确保以 NUL 结尾 */
                strncpy(cfg->ip, value, sizeof(cfg->ip) - 1);
                cfg->ip[sizeof(cfg->ip) - 1] = '\0';
            }
            else if (strcmp(key, "port") == 0)
            {
                /* 将端口写入配置结构，注意端口为字符串形式 */
                strncpy(cfg->port, value, sizeof(cfg->port) - 1);
                cfg->port[sizeof(cfg->port) - 1] = '\0';
            }
            else if (strcmp(key, "root_path") == 0)
            {
                strncpy(cfg->root_path, value, sizeof(cfg->root_path) - 1);
                cfg->root_path[sizeof(cfg->root_path) - 1] = '\0';
                /* 同步到全局变量 */
                strncpy(g_root_path, cfg->root_path, sizeof(g_root_path) - 1);
                g_root_path[sizeof(g_root_path) - 1] = '\0';
            }
        }
        /* 忽略无法解析的行 */
    }

    fclose(f);
    return 0;
}
